package mysql8学习.高级.第11章_数据库的设计规范之范式;

public class D_反范式化概述 {
}
/**
 * 3.反范式化
 * 3.1概述
 * 有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余，其实对业务来说十分重要。
 * 这个时候，我们就要遵循业务优先的原则，首先满足业务需求，再尽量减少冗余。
 * 如果数据库中的数据量比较大，系统的UV和PV访问频次比较高,
 * 则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询，
 * 在一定程度上会影响数据库的读性能。
 * 如果我们想对查询效率进行优化，反范式优化也是一种优化思路。
 * 此时，可以通过在数据表中增加冗余字段来提高数据库的读性能。
 *
 * 规范化vs性能
 * 1. 为满足某种商业目标，数据库性能比规范化数据库更重要
 * 2. 在数据规范化的同时，要综合考虑数据库的性能
 * 3. 通过在给定的表中添加额外的字段，以大量减少需要从中搜索信息所需的时间
 * 4. 通过在给定的表中插入计算列，以方便查询
 *
 *
 * 3.3反范式的新问题
 * 反范式可以通过空间换时间，提升查询的效率，但是反范式也会带来一些新问题:
 * ● 存储空间变大了
 * ● 一个表中字段做了修改,另一个表中冗余的字段也需要做同步修改，否则数据不一致
 * ● 若采用存储过程来支持数据的更新、删除等额外操作，如果更新频繁,会非常消耗系统资源
 * ● 在数据量小的情况下，反范式不能体现性能的优势，可能还会让数据库的设计更加复杂
 *
 * 3.4反范式的适用场景
 * 当冗余信息有价值或者能大幅度提高查询效率的时候，我们才会采取反范式的优化。
 *
 * 1.增加冗余字段的建议
 *   增加冗余字段一定要符合如下两个条件。只有满足这两个条件，才可以考虑增加冗余字段。
 *     1) 这个冗余字段 不需要经常进行修改;
 *     2) 这个冗余字段 查询的时候不可或缺。
 *
 * 2.历史快照、历史数据的需要
 * 在现实生活中，我们经常需要一些冗余信息，比如订单中的收货人信息，包括姓名、电话和地址等。
 * 每次发生的订单收货信息都属于历史快照,需要进行保存，
 * 但用户可以随时修改自己的信息,这时保存这些冗余信息是非常有必要的。
 *
 * 反范式优化也常用在数据仓库的设计中，因为数据仓库通常存储历史数据,
 * 对增删改的实时性要求不强，对历史数据的分析需求强。
 * 这时适当允许数据的冗余度,更方便进行数据分析。
 * 我简单总结下数据仓库和数据库在使用上的区别:
 *  1. 数据库设计的目的在于捕获数据，而数据仓库设计的目的在于分析数据;
 *  2. 数据库对数据的增删改实时性要求强，需要存储在线的用户数据，
 *     而数据仓库存储的一般是历史数据;
 *  3. 数据库设计需要尽量避免冗余，但为了提高查询效率也允许一定的冗余度，
 *     而数据仓库在设计上更偏向采用反范式设计。
 *
 */